package com.nfit.shopcommon.utils;

import com.nfit.shopmodel.entity.system.SysMenu;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.ArrayList;
import java.util.List;

/**
 * ClassName:MenuUtil
 * Package:com.nfit.shopcommon.utils
 * Description
 *
 * @Author L
 * @Create 2024/11/19 20:14
 */
@Schema(description = "构建树型菜单工具类")
public class MenuUtil {

    /**
     * 使用递归方法建菜单
     * 实现思路：
     * 第一步 ：创建新的List集合 , 用于接收最终的树形菜单。
     * 第二步：遍历所有的菜单数据集合,判断 parentId == 0(约定parentId == 0 则是一级菜单即父级菜单)添加到trees集合中
     * ,封装 findChildren(menu, menuList) ： 表示查询子节点, menu 是一级菜单实体,menuList 是所有的菜单数据集合
     *  第三步：返回最终的树形菜单
     * @param menuList 全部的菜单数据
     */
    public static List<SysMenu> buildTree(List<SysMenu> menuList) {
        List<SysMenu> trees = new ArrayList<>();
        menuList.forEach(menu -> {
            if (menu.getParentId().longValue() == 0) {
                // 方法里面传递两个参数：第一个参数当前第一层菜单，第二个参数是所有菜单集合
                trees.add(findChildren(menu, menuList));
            }
        });
        return trees;
    }

    /**
     * 递归查找子节点
     * 实现思路 ：
     * 第一步：sysMenu.setChildren(new ArrayList<>()); 表示创建一个信息子菜单列表
     * 第二步：遍历所有的菜单数据集合,判断 ParentId  ==  一级菜单的id  ：表示找到二级菜单
     *          同理：判断 ParentId == 二级菜单的id ：表示找到三级菜单
     * 第三步：返回找到的所有子菜单添加到sysMenu的子菜单Children列表中，并返回sysMenu。
     * @param sysMenu 一级菜单实体
     * @param menuList 全部的菜单数据
     */
    public static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> menuList){
        //封装子节点
        sysMenu.setChildren(new ArrayList<SysMenu>());
        //遍历
        for (SysMenu item : menuList) {
            //判断,所有的菜单数据 ParentId == 一级菜单的id ：表示找到二级菜单
            //同理：所有的菜单数据 ParentId == 二级菜单的id ：表示找到三级菜单
            if (item.getParentId().longValue() == sysMenu.getId().longValue()){
                //满足条件封装数据
                // 方法里面传递两个参数：第一个参数下一层菜单对象，第二个参数是所有菜单集合
                sysMenu.getChildren().add(findChildren(item,menuList));
            }
        }
        return sysMenu;
    }

}
